#include <stdio.h>      // 标准输入输出库
#include <stdlib.h>     // 标准库函数
#include <dirent.h>     // 读取/proc目录
#include <string.h>     // 字符串处理库
#include <ctype.h>      // 包含 isdigit 函数的声明
#include <signal.h>

int main(int argc, char *argv[]) {
    DIR *proc = opendir("/proc");   // 遍历/proc目录
    struct dirent *entry;

    if (argc == 1) {
        // 如果未传递进程号参数，打印所有的进程
        while ((entry = readdir(proc)) != NULL) {
            // 对于每个目录项，检查其是否为数字，以确定它是否代表一个进程
            if (isdigit(*entry->d_name)) {
                char path[256], comm[256];
                // 对于每个进程，打印其PID和进程名称，进程名称可以在/proc/[PID]/comm文件中找到
                snprintf(path, sizeof(path), "/proc/%s/comm", entry->d_name);
                // 将格式化的数据写入字符串。在这里，它将/proc/%s/comm 格式的字符串和当前目录条目的名称entry->d_name，即进程ID组合起来，构造出一个路径，该路径指向包含进程名称的文件。其中，sizeof(path)确保写入path的数据不会超出数组的大小，防止缓冲区溢出
                FILE *fp = fopen(path, "r");
                if (fp) {
                    if (fgets(comm, sizeof(comm), fp)) { // 使用fgets从打开的文件中读取一行
                        printf("PID: %s, Name: %s", entry->d_name, comm);
                    }
                    fclose(fp);
                }
            }
        }
    }
    else if (argc == 2) {
        // 如果传递了进程号参数，使用kill函数尝试杀死该进程
        int pid = atoi(argv[1]);
        if (kill(pid, SIGTERM) == 0) {
            printf("Process with PID %d has been terminated.\n", pid);
        } else {
            perror("Error terminating process");
            return EXIT_FAILURE;
        }
    }

    closedir(proc);
    return EXIT_SUCCESS;
}

